package com.ibeeking.found.upms.b.rest.service;

import com.ibeeking.found.upms.service.common.param.*;
import com.ibeeking.found.common.entity.LoginUserDTO;
import com.ibeeking.found.common.entity.UserInfoDTO;
import com.ibeeking.found.upms.api.common.dto.TenantUserDTO;
import com.ibeeking.found.upms.api.common.query.AccountLoginQuery;
import com.ibeeking.found.upms.service.common.bo.TenantUserBO;
import com.ibeeking.found.upms.service.common.dos.TenantUserDO;
import com.ibeeking.found.upms.service.common.po.TenantUserPO;
import com.ibeeking.found.upms.service.common.query.SelectTenantUserQuery;
import com.ibeeking.found.upms.service.common.query.TenantUserPageQuery;
import com.ibeeking.found.upms.service.common.vo.CurrentUserVO;
import com.ibeeking.found.upms.service.common.vo.TenantListVO;
import com.ibeeking.found.upms.service.common.vo.TenantUserVO;
import com.ibeeking.found.upms.service.common.vo.GmcUserPageVO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.List;

/**
 * @Author ibeeking
 */
public interface ITenantUserService {

    /**
     * 分页查询用户列表
     *
     * @param query
     * @return
     */
    Page<GmcUserPageVO> pageList(TenantUserPageQuery query);

    /**
     * 租户用户新增
     *
     * @param tenantId
     * @param param
     * @return
     */
    Boolean add(Integer tenantId, TenantUserParam param);

    /**
     * 租户用户修改
     *
     * @param param
     * @return
     */
    Boolean modify(TenantUserParam param);

    /**
     * 修改数据
     *
     * @param tenantUserDO
     * @param tenantIds
     * @param all
     * @return
     */
    Boolean modifyData(TenantUserDO tenantUserDO, List<Integer> tenantIds, Boolean all);

    /**
     * 查询租户用户
     *
     * @param id
     * @return
     */
    TenantUserVO view(Long id);

    TenantUserBO queryById(Long id);

    /**
     * 修改状态
     *
     * @param id
     * @param status
     * @param userId
     * @return
     */
    Boolean changeStatus(Long id, Integer status, Long userId);

    /**
     * 删除
     *
     * @param id
     * @return
     */
    Boolean del(Long id);

    Boolean findPwd(UserFindPwdParam userFindPwdParam);

    /**
     * 重置密码
     *
     * @param id
     * @return
     */
    Boolean resetPwd(Long id);

    /**
     * 修改密码
     *
     * @param userModifyPwdParam
     * @return
     */
    Boolean modifyPwd(Long userId, UserModifyPwdParam userModifyPwdParam);

    /**
     * 查询角色id列表
     *
     * @param userId
     * @return
     */
    List<String> queryRoleIdsByUserId(Long userId);

    UserInfoDTO queryLoginUser(Long userId, Integer tenantId);

    Boolean modifyPassword(Long id, String newPassword);

    /**
     * @param userId
     * @param param
     * @return
     */
    Boolean modifySelf(Long userId, TenantUserParam param);

    /**
     * 注销(老的-弃用)
     *
     * @param tenantId
     * @param userId
     * @return
     */
    Boolean logout(String tenantId, Long userId);

    /**
     * 注销
     *
     * @param param
     * @return
     */
    Boolean logout(LogoutUserParam param);

    List<TenantUserVO> selectList(SelectTenantUserQuery query);

    /**
     * 离职
     *
     * @param id
     * @return
     */
    Boolean quit(Long id);

    /**
     * 账号查询
     *
     * @param query
     * @return
     */
    LoginUserDTO queryAccountLogin(AccountLoginQuery query);

    /**
     * 通过手机号查询
     *
     * @param mobile
     * @return
     */
    TenantUserDTO queryByMobile(String mobile);

    /**
     * 通过租户Id查询
     *
     * @param tenantId
     * @return
     */
    List<TenantUserDTO> queryByTenantId(Integer tenantId);
    /**
     * 查询
     *
     * @param userId
     * @return
     */
    List<TenantListVO> queryTenants(Long userId);

    CurrentUserVO currentInfo(Long id);

    Boolean updateAll(Integer tenantId, TenantUserDO tenantUserDO);

    Boolean modifyMobile(Long userId, ModifyMobileParam param);

    List<TenantUserPO> queryByMobiles(List<String> mobiles);

    /**
     * 手机验证码校验
     * @param phone
     * @param verificationCode
     * @param key
     * @return
     */
    Boolean phoneCodeCheck(String phone, String verificationCode, String key);
}
